home *** CD-ROM | disk | FTP | other *** search
/ InfoMagic Internet Tools 1993 July / Internet Tools.iso / RockRidge / ip / trace / tcpdump-2.2.1 / bpf / lib / bpf_image.c next >
Encoding:
C/C++ Source or Header  |  1992-01-26  |  4.7 KB  |  283 lines

  1. /*
  2.  * Copyright (c) 1988-1990 The Regents of the University of California.
  3.  * All rights reserved.
  4.  *
  5.  * Redistribution and use in source and binary forms, with or without
  6.  * modification, are permitted provided that: (1) source code distributions
  7.  * retain the above copyright notice and this paragraph in its entirety, (2)
  8.  * distributions including binary code include the above copyright notice and
  9.  * this paragraph in its entirety in the documentation or other materials
  10.  * provided with the distribution, and (3) all advertising materials mentioning
  11.  * features or use of this software display the following acknowledgement:
  12.  * ``This product includes software developed by the University of California,
  13.  * Lawrence Berkeley Laboratory and its contributors.'' Neither the name of
  14.  * the University nor the names of its contributors may be used to endorse
  15.  * or promote products derived from this software without specific prior
  16.  * written permission.
  17.  * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED
  18.  * WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF
  19.  * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
  20.  */
  21.  
  22. #ifndef lint
  23. static char rcsid[] =
  24.     "@(#) $Header: bpf_image.c,v 1.10 92/01/26 21:01:16 mccanne Exp $ (LBL)";
  25. #endif
  26.  
  27. #include <stdio.h>
  28. #include <string.h>
  29.  
  30. #include <sys/types.h>
  31. #include <sys/time.h>
  32. #include <net/bpf.h>
  33.  
  34. char *
  35. bpf_image(p, n)
  36.     struct bpf_insn *p;
  37.     int n;
  38. {
  39.     int v;
  40.     char *fmt, *op;
  41.     static char image[256];
  42.     char operand[64];
  43.     
  44.     v = p->k;
  45.     switch (p->code) {
  46.         
  47.     default:
  48.         op = "unimp";
  49.         fmt = "0x%x";
  50.         v = p->code;
  51.         break;
  52.             
  53.     case BPF_RET|BPF_K:
  54.         op = "ret";
  55.         fmt = "#%d";
  56.         break;
  57.  
  58.     case BPF_RET|BPF_A:
  59.         op = "ret";
  60.         fmt = "";
  61.         break;
  62.  
  63.     case BPF_LD|BPF_W|BPF_ABS:
  64.         op = "ld";
  65.         fmt = "[%d]";
  66.         break;
  67.  
  68.     case BPF_LD|BPF_H|BPF_ABS:
  69.         op = "ldh";
  70.         fmt = "[%d]";
  71.         break;
  72.  
  73.     case BPF_LD|BPF_B|BPF_ABS:
  74.         op = "ldb";
  75.         fmt = "[%d]";
  76.         break;
  77.  
  78.     case BPF_LD|BPF_W|BPF_LEN:
  79.         op = "ld";
  80.         fmt = "#pktlen";
  81.         break;
  82.  
  83.     case BPF_LD|BPF_W|BPF_IND:
  84.         op = "ld";
  85.         fmt = "[x + %d]";
  86.         break;
  87.  
  88.     case BPF_LD|BPF_H|BPF_IND:
  89.         op = "ldh";
  90.         fmt = "[x + %d]";
  91.         break;
  92.  
  93.     case BPF_LD|BPF_B|BPF_IND:
  94.         op = "ldb";
  95.         fmt = "[x + %d]";
  96.         break;
  97.  
  98.     case BPF_LD|BPF_IMM:
  99.         op = "ld";
  100.         fmt = "#0x%x";
  101.         break;
  102.  
  103.     case BPF_LDX|BPF_IMM:
  104.         op = "ldx";
  105.         fmt = "#0x%x";
  106.         break;
  107.  
  108.     case BPF_LDX|BPF_MSH|BPF_B:
  109.         op = "ldxb";
  110.         fmt = "4*([%d]&0xf)";
  111.         break;
  112.             
  113.     case BPF_LD|BPF_MEM:
  114.         op = "ld";
  115.         fmt = "M[%d]";
  116.         break;
  117.             
  118.     case BPF_LDX|BPF_MEM:
  119.         op = "ldx";
  120.         fmt = "M[%d]";
  121.         break;
  122.  
  123.     case BPF_ST:
  124.         op = "st";
  125.         fmt = "M[%d]";
  126.         break;
  127.  
  128.     case BPF_STX:
  129.         op = "stx";
  130.         fmt = "M[%d]";
  131.         break;
  132.  
  133.     case BPF_JMP|BPF_JA:
  134.         op = "ja";
  135.         fmt = "%d";
  136.         v = n + p->k;
  137.         break;
  138.  
  139.     case BPF_JMP|BPF_JGT|BPF_K:
  140.         op = "jgt";
  141.         fmt = "#0x%x";
  142.         break;
  143.  
  144.     case BPF_JMP|BPF_JGE|BPF_K:
  145.         op = "jge";
  146.         fmt = "#0x%x";
  147.         break;
  148.  
  149.     case BPF_JMP|BPF_JEQ|BPF_K:
  150.         op = "jeq";
  151.         fmt = "#0x%x";
  152.         break;
  153.  
  154.     case BPF_JMP|BPF_JSET|BPF_K:
  155.         op = "jset";
  156.         fmt = "#0x%x";
  157.         break;
  158.  
  159.     case BPF_JMP|BPF_JGT|BPF_X:
  160.         op = "jgt";
  161.         fmt = "x";
  162.         break;
  163.  
  164.     case BPF_JMP|BPF_JGE|BPF_X:
  165.         op = "jge";
  166.         fmt = "x";
  167.         break;
  168.  
  169.     case BPF_JMP|BPF_JEQ|BPF_X:
  170.         op = "jeq";
  171.         fmt = "x";
  172.         break;
  173.  
  174.     case BPF_JMP|BPF_JSET|BPF_X:
  175.         op = "jset";
  176.         fmt = "x";
  177.         break;
  178.  
  179.     case BPF_ALU|BPF_ADD|BPF_X:
  180.         op = "add";
  181.         fmt = "x";
  182.         break;
  183.  
  184.     case BPF_ALU|BPF_SUB|BPF_X:
  185.         op = "sub";
  186.         fmt = "x";
  187.         break;
  188.             
  189.     case BPF_ALU|BPF_MUL|BPF_X:
  190.         op = "mul";
  191.         fmt = "x";
  192.         break;
  193.             
  194.     case BPF_ALU|BPF_DIV|BPF_X:
  195.         op = "div";
  196.         fmt = "x";
  197.         break;
  198.             
  199.     case BPF_ALU|BPF_AND|BPF_X:
  200.         op = "and";
  201.         fmt = "x";
  202.         break;
  203.             
  204.     case BPF_ALU|BPF_OR|BPF_X:
  205.         op = "or";
  206.         fmt = "x";
  207.         break;
  208.  
  209.     case BPF_ALU|BPF_LSH|BPF_X:
  210.         op = "lsh";
  211.         fmt = "x";
  212.         break;
  213.  
  214.     case BPF_ALU|BPF_RSH|BPF_X:
  215.         op = "rsh";
  216.         fmt = "x";
  217.         break;
  218.  
  219.     case BPF_ALU|BPF_ADD|BPF_K:
  220.         op = "add";
  221.         fmt = "#%d";
  222.         break;
  223.  
  224.     case BPF_ALU|BPF_SUB|BPF_K:
  225.         op = "sub";
  226.         fmt = "#%d";
  227.         break;
  228.             
  229.     case BPF_ALU|BPF_MUL|BPF_K:
  230.         op = "mul";
  231.         fmt = "#%d";
  232.         break;
  233.             
  234.     case BPF_ALU|BPF_DIV|BPF_K:
  235.         op = "div";
  236.         fmt = "#%d";
  237.         break;
  238.             
  239.     case BPF_ALU|BPF_AND|BPF_K:
  240.         op = "and";
  241.         fmt = "#%d";
  242.         break;
  243.             
  244.     case BPF_ALU|BPF_OR|BPF_K:
  245.         op = "or";
  246.         fmt = "#%d";
  247.         break;
  248.  
  249.     case BPF_ALU|BPF_LSH|BPF_K:
  250.         op = "lsh";
  251.         fmt = "#%d";
  252.         break;
  253.  
  254.     case BPF_ALU|BPF_RSH|BPF_K:
  255.         op = "rsh";
  256.         fmt = "#%d";
  257.         break;
  258.  
  259.     case BPF_ALU|BPF_NEG:
  260.         op = "neg";
  261.         fmt = "";
  262.         break;
  263.  
  264.     case BPF_MISC|BPF_TAX:
  265.         op = "tax";
  266.         fmt = "";
  267.         break;
  268.  
  269.     case BPF_MISC|BPF_TXA:
  270.         op = "txa";
  271.         fmt = "";
  272.         break;
  273.     }
  274.     (void)sprintf(operand, fmt, v);
  275.     (void)sprintf(image,
  276.               (BPF_CLASS(p->code) == BPF_JMP && 
  277.                BPF_OP(p->code) != BPF_JA) ?
  278.               "(%03d) %-8s %-16s jt %d\tjf %d"
  279.               : "(%03d) %-8s %s",
  280.               n, op, operand, n + 1 + p->jt, n + 1 + p->jf);
  281.     return image;
  282. }
  283.